package cn.mengfly.algorithm.util;

import cn.mengfly.algorithm.sort.SortUtil;

import java.util.Random;

/**
 * 提供有关数组的工具类
 *
 * @author wangp
 */
public class ArrayUtil {

    /**
     * 生成从0开始递增的递增数组
     *
     * @param length 数组大小
     * @return 递增数组
     */
    public static int[] range(int length) {
        return range(0, length, 1);
    }

    /**
     * 生成从min到max之间的递增数组
     *
     * @param min   min
     * @param max   max
     * @param added 递增大小
     * @return 递增数组
     */
    public static int[] range(int min, int max, int added) {
        int hasMod = (max - min) % added > 0 ? 1 : 0;
        int[] range = new int[(max - min) / added + hasMod];
        for (int i = 0; i < range.length; i++) {
            range[i] = min + i * added;
        }
        return range;
    }

    /**
     * 生成一个随机的整数数组
     *
     * @param size 生成的数组大小
     * @param min  数组内容的整数范围最小值
     * @param max  数组内容的整数范围最大值
     * @return 随机的整数数组
     */
    public static Integer[] random(int size, int min, int max) {
        Random random = new Random();
        Integer[] arr = new Integer[size];

        for (int i = 0; i < size; i++) {
            arr[i] = min + random.nextInt(max - min);
        }
        return arr;
    }

    /**
     * 翻转数组
     *
     * @param arr arr
     */
    public static <T> void reverse(T[] arr) {
        for (int i = 0; i < arr.length / 2; i++) {
            SortUtil.swap(arr, i, arr.length - i - 1);
        }
    }

    /**
     * 打乱数组
     * @param arr 要打乱的数组
     */
    public static  void shuffle(Object[] arr) {
        Random random = new Random();
        for (int i = arr.length - 1; i > 0; i--) {
            SortUtil.swap(arr, i, random.nextInt(i));
        }
    }
}
